home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / dpmigcc5.zip / RSX / SOURCE / STUB / STUBDJ.C < prev   
C/C++ Source or Header  |  1994-12-12  |  2KB  |  90 lines

  1. /*
  2. ** running bound DJGPP exe-files
  3. ** go32.exe without DPMI
  4. ** rsxdj.exe with DPMI
  5. */
  6.  
  7. #include <process.h>
  8. #include <dos.h>
  9.  
  10. unsigned _heaplen = 4096;
  11. unsigned _stklen = 2048;
  12. extern unsigned _psp;
  13.  
  14. int    dpmi_host(void);    /* ret = 0 DPMI, else not */
  15. int    get_ds(void);
  16. void    print_string_stdout(char *s);
  17.  
  18. static void x2s(int v, char *s)
  19. {
  20.     static char hex[] = "0123456789abcdef";
  21.     int i;
  22.  
  23.     for (i = 0; i < 4; i++) {
  24.     s[3 - i] = hex[v & 15];
  25.     v >>= 4;
  26.     }
  27.     s[4] = 0;
  28. }
  29.  
  30. #ifdef __WATCOMC__
  31. #pragma aux dpmi_host = \
  32.     "mov ax , 1687H"    \
  33.     "int 2FH"           \
  34.     modify [ax bx cx dx si di es] \
  35.     value [ax];
  36.  
  37. #pragma aux get_ds =    \
  38.     "mov ax, ds"        \
  39.     value [ax];
  40.  
  41. #pragma aux print_string_stdout parm [dx] = \
  42.     "mov ah , 9"        \
  43.     "int 21H"           \
  44.     modify [ax dx];
  45. #endif
  46.  
  47. #ifdef __TURBOC__
  48. int dpmi_host(void)
  49. {
  50.     _AX = 0x1687;
  51.     geninterrupt(0x2F);
  52.     return _AX;
  53. }
  54. int get_ds(void)
  55. {
  56.     return _DS;
  57. }
  58. void print_string_stdout(char *s)
  59. {
  60.     _asm mov ah,9;
  61.     _asm mov dx, s;
  62.     _asm int 0x21;
  63. }
  64. #endif
  65.  
  66. char rsx_name[] = "RSX.EXE";
  67. char go32_name[] = "GO32.EXE";
  68.  
  69. main(int argc, char **argv)
  70. {
  71.     char s_argc[5], s_seg[5], s_argv[5];
  72.     char *exe_name;
  73.     int r=-1;
  74.  
  75.     if (dpmi_host() == 0)
  76.     exe_name = rsx_name;
  77.     else
  78.     exe_name = go32_name;
  79.  
  80.     x2s(argc, s_argc);
  81.     x2s( get_ds(), s_seg);
  82.     x2s((int) argv, s_argv);
  83.     r = spawnlp(P_WAIT, exe_name, exe_name, "!proxy", s_argc, s_seg, s_argv, 0);
  84.     if (r == -1) {
  85.     print_string_stdout(exe_name);
  86.     print_string_stdout(":file not found\r\n$");
  87.     }
  88.     return r;
  89. }
  90.